#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
#include <limits.h>

#include "optimizer.h"

// 时间常量定义，单位ms
typedef enum {
    ARM_BACK = 90,
    FLIP_90 = 158,  //未用
    FLIP_180 = 241,  //未用
    ROTATE_90 = 46,
    ROTATE_180 = 89,
    GRIP_REDUNDANT = 362-388 //未用
} TimeCost;

// 手臂侧定义
typedef enum {
    LEFT = 1,
    RIGHT = 2
} ArmSide;

// 状态字符串列表
const char state_str_list[24][2] = {
    {'D','F'}, {'D','B'}, {'D','L'}, {'D','R'}, 
    {'U','F'}, {'U','B'}, {'U','L'}, {'U','R'},
    {'F','L'}, {'F','R'}, {'F','U'}, {'F','D'}, 
    {'B','L'}, {'B','R'}, {'B','U'}, {'B','D'},
    {'L','F'}, {'L','B'}, {'L','U'}, {'L','D'}, 
    {'R','F'}, {'R','B'}, {'R','U'}, {'R','D'}
};
// 翻转序列
typedef struct {
    const int16_t time;
    const char* sequence; 
} FlipSequence;

// https://gitee.com/hemn1990/two-arm-two-phase/blob/master/tools/cube_optimizer.py
// 翻转序列池（消耗时间，动作序列），时间计算使用software/cube_optimizer.py进行
const FlipSequence flip_sequences[83] = {
    {0, ""},
    {158, "R1 L+F R0 "},
    {241, "R1 L*F R0 "},
    {158, "R1 L-F R0 "},
    {158, "L1 R+F L0 "},
    {241, "L1 R*F L0 "},
    {158, "L1 R-F L0 "},
    {380, "R1 L+F R0 L2 L+N R+F L0 "},
    {463, "R1 L+F R0 L2 L+N R*F L0 "},
    {380, "R1 L+F R0 L2 L+N R-F L0 "},
    {399, "R1 L*F R0 L1 R+F L0 "},
    {482, "R1 L*F R0 L1 R*F L0 "},
    {399, "R1 L*F R0 L1 R-F L0 "},
    {380, "R1 L-F R0 L2 L+N R+F L0 "},
    {463, "R1 L-F R0 L2 L+N R*F L0 "},
    {380, "R1 L-F R0 L2 L+N R-F L0 "},
    {380, "L1 R+F L0 R2 R+N L+F R0 "},
    {463, "L1 R+F L0 R2 R+N L*F R0 "},
    {380, "L1 R+F L0 R2 R+N L-F R0 "},
    {399, "L1 R*F L0 R1 L+F R0 "},
    {399, "L1 R*F L0 R1 L-F R0 "},
    {380, "L1 R-F L0 R2 R+N L+F R0 "},
    {463, "L1 R-F L0 R2 R+N L*F R0 "},
    {380, "L1 R-F L0 R2 R+N L-F R0 "},
    {222, "R2 R+N L+F R0 "},
    {305, "R2 R+N L*F R0 "},
    {222, "R2 R+N L-F R0 "},
    {380, "R2 R+N L+F R0 R1 L-F R0 "},
    {444, "R2 R+N L+F R0 L2 L+N R+F L0 "},
    {527, "R2 R+N L+F R0 L2 L+N R*F L0 "},
    {444, "R2 R+N L+F R0 L2 L+N R-F L0 "},
    {463, "R2 R+N L*F R0 L1 R+F L0 "},
    {546, "R2 R+N L*F R0 L1 R*F L0 "},
    {463, "R2 R+N L*F R0 L1 R-F L0 "},
    {444, "R2 R+N L-F R0 L2 L+N R+F L0 "},
    {527, "R2 R+N L-F R0 L2 L+N R*F L0 "},
    {444, "R2 R+N L-F R0 L2 L+N R-F L0 "},
    {316, "L1 R+F L0 R1 L+F R0 "},
    {399, "L1 R+F L0 R1 L*F R0 "},
    {316, "L1 R+F L0 R1 L-F R0 "},
    {463, "L1 R*F L0 R2 R+N L+F R0 "},
    {463, "L1 R*F L0 R2 R+N L-F R0 "},
    {316, "L1 R-F L0 R1 L+F R0 "},
    {399, "L1 R-F L0 R1 L*F R0 "},
    {316, "L1 R-F L0 R1 L-F R0 "},
    {222, "L2 L+N R+F L0 "},
    {305, "L2 L+N R*F L0 "},
    {222, "L2 L+N R-F L0 "},
    {316, "R1 L+F R0 L1 R+F L0 "},
    {399, "R1 L+F R0 L1 R*F L0 "},
    {316, "R1 L+F R0 L1 R-F L0 "},
    {463, "R1 L*F R0 L2 L+N R+F L0 "},
    {546, "R1 L*F R0 L2 L+N R*F L0 "},
    {463, "R1 L*F R0 L2 L+N R-F L0 "},
    {316, "R1 L-F R0 L1 R+F L0 "},
    {399, "R1 L-F R0 L1 R*F L0 "},
    {316, "R1 L-F R0 L1 R-F L0 "},
    {444, "L2 L+N R+F L0 R2 R+N L+F R0 "},
    {527, "L2 L+N R+F L0 R2 R+N L*F R0 "},
    {444, "L2 L+N R+F L0 R2 R+N L-F R0 "},
    {380, "L2 L+N R+F L0 L1 R-F L0 "},
    {463, "L2 L+N R*F L0 R1 L+F R0 "},
    {463, "L2 L+N R*F L0 R1 L-F R0 "},
    {444, "L2 L+N R-F L0 R2 R+N L+F R0 "},
    {527, "L2 L+N R-F L0 R2 R+N L*F R0 "},
    {444, "L2 L+N R-F L0 R2 R+N L-F R0 "},
    {380, "R2 R+N L+F R0 L1 R+F L0 "},
    {463, "R2 R+N L+F R0 L1 R*F L0 "},
    {380, "R2 R+N L+F R0 L1 R-F L0 "},
    {527, "R2 R+N L*F R0 L2 L+N R+F L0 "},
    {610, "R2 R+N L*F R0 L2 L+N R*F L0 "},
    {527, "R2 R+N L*F R0 L2 L+N R-F L0 "},
    {380, "R2 R+N L-F R0 L1 R+F L0 "},
    {463, "R2 R+N L-F R0 L1 R*F L0 "},
    {380, "R2 R+N L-F R0 L1 R-F L0 "},
    {380, "L2 L+N R+F L0 R1 L+F R0 "},
    {463, "L2 L+N R+F L0 R1 L*F R0 "},
    {380, "L2 L+N R+F L0 R1 L-F R0 "},
    {527, "L2 L+N R*F L0 R2 R+N L+F R0 "},
    {527, "L2 L+N R*F L0 R2 R+N L-F R0 "},
    {380, "L2 L+N R-F L0 R1 L+F R0 "},
    {463, "L2 L+N R-F L0 R1 L*F R0 "},
    {380, "L2 L+N R-F L0 R1 L-F R0 "}
};

// 96x96翻转表
const int8_t flip_table[96][96] = {
    {0,-1,-1,-1,2,-1,-1,-1,-1,-1,1,-1,-1,-1,3,-1,5,-1,-1,-1,11,-1,-1,-1,8,-1,20,-1,14,-1,19,-1,-1,7,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,22,10,-1,-1,-1,-1,21,-1,-1,-1,23,-1,-1,4,-1,-1,17,12,-1,-1,-1,-1,18,-1,-1,-1,16,-1},
    {27,0,-1,-1,25,-1,-1,-1,-1,-1,24,-1,-1,-1,26,-1,-1,5,-1,-1,32,-1,-1,-1,29,-1,41,-1,35,-1,40,-1,-1,28,-1,-1,-1,36,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1,-1,-1,34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1,43,31,-1,-1,-1,-1,42,-1,-1,-1,44,-1,4,-1,-1,-1,38,33,-1,-1,-1,-1,39,-1,-1,-1,37,-1},
    {60,-1,0,-1,-1,-1,2,-1,1,-1,-1,-1,3,-1,-1,-1,46,-1,-1,-1,52,-1,-1,-1,49,-1,62,-1,55,-1,61,-1,-1,48,-1,-1,-1,56,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,47,-1,-1,64,51,-1,-1,-1,-1,63,-1,-1,-1,65,-1,-1,45,-1,-1,58,53,-1,-1,-1,-1,59,-1,-1,-1,57,-1},
    {-1,60,27,0,-1,-1,25,-1,24,-1,-1,-1,26,-1,-1,-1,-1,46,-1,-1,70,-1,-1,-1,67,-1,79,-1,73,-1,78,-1,-1,66,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,47,-1,-1,-1,81,69,-1,-1,-1,-1,80,-1,-1,-1,82,-1,45,-1,-1,-1,76,71,-1,-1,-1,-1,77,-1,-1,-1,75,-1},
    {2,-1,-1,-1,0,-1,-1,-1,-1,-1,3,-1,-1,-1,1,-1,11,-1,-1,-1,5,-1,-1,-1,14,-1,19,-1,8,-1,20,-1,-1,13,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,17,12,-1,-1,-1,4,-1,-1,-1,-1,18,-1,-1,-1,16,-1,22,10,-1,-1,-1,6,-1,-1,-1,-1,21,-1,-1,-1,23,-1},
    {25,-1,-1,-1,27,0,-1,-1,-1,-1,26,-1,-1,-1,24,-1,32,-1,-1,-1,-1,5,-1,-1,35,-1,40,-1,29,-1,41,-1,-1,34,-1,-1,-1,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,38,33,-1,-1,4,-1,-1,-1,-1,-1,39,-1,-1,-1,37,-1,43,31,-1,-1,6,-1,-1,-1,-1,-1,42,-1,-1,-1,44,-1},
    {-1,-1,2,-1,60,-1,0,-1,3,-1,-1,-1,1,-1,-1,-1,52,-1,-1,-1,46,-1,-1,-1,55,-1,61,-1,49,-1,62,-1,-1,54,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,58,53,-1,-1,-1,45,-1,-1,-1,-1,59,-1,-1,-1,57,-1,64,51,-1,-1,-1,47,-1,-1,-1,-1,63,-1,-1,-1,65,-1},
    {-1,-1,25,-1,-1,60,27,0,26,-1,-1,-1,24,-1,-1,-1,70,-1,-1,-1,-1,46,-1,-1,73,-1,78,-1,67,-1,79,-1,-1,72,-1,-1,-1,68,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,76,71,-1,-1,45,-1,-1,-1,-1,-1,77,-1,-1,-1,75,-1,81,69,-1,-1,47,-1,-1,-1,-1,-1,80,-1,-1,-1,82,-1},
    {-1,-1,3,-1,-1,-1,1,-1,0,-1,-1,-1,2,-1,-1,-1,14,-1,19,-1,8,-1,20,-1,5,-1,-1,-1,11,-1,-1,-1,-1,4,-1,-1,17,12,-1,-1,-1,-1,18,-1,-1,-1,16,-1,-1,6,-1,-1,22,10,-1,-1,-1,-1,21,-1,-1,-1,23,-1,-1,15,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {-1,-1,26,-1,-1,-1,24,-1,27,0,-1,-1,25,-1,-1,-1,35,-1,40,-1,29,-1,41,-1,-1,5,-1,-1,32,-1,-1,-1,4,-1,-1,-1,38,33,-1,-1,-1,-1,39,-1,-1,-1,37,-1,6,-1,-1,-1,43,31,-1,-1,-1,-1,42,-1,-1,-1,44,-1,-1,36,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,34,-1,-1,-1,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {3,-1,-1,-1,1,-1,-1,-1,60,-1,0,-1,-1,-1,2,-1,55,-1,61,-1,49,-1,62,-1,46,-1,-1,-1,52,-1,-1,-1,-1,45,-1,-1,58,53,-1,-1,-1,-1,59,-1,-1,-1,57,-1,-1,47,-1,-1,64,51,-1,-1,-1,-1,63,-1,-1,-1,65,-1,-1,56,-1,-1,-1,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {26,-1,-1,-1,24,-1,-1,-1,-1,60,27,0,-1,-1,25,-1,73,-1,78,-1,67,-1,79,-1,-1,46,-1,-1,70,-1,-1,-1,45,-1,-1,-1,76,71,-1,-1,-1,-1,77,-1,-1,-1,75,-1,47,-1,-1,-1,81,69,-1,-1,-1,-1,80,-1,-1,-1,82,-1,-1,74,-1,-1,-1,66,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,-1,-1,-1,68,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {-1,-1,1,-1,-1,-1,3,-1,2,-1,-1,-1,0,-1,-1,-1,8,-1,20,-1,14,-1,19,-1,11,-1,-1,-1,5,-1,-1,-1,22,10,-1,-1,-1,6,-1,-1,-1,-1,21,-1,-1,-1,23,-1,17,12,-1,-1,-1,4,-1,-1,-1,-1,18,-1,-1,-1,16,-1,-1,9,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {-1,-1,24,-1,-1,-1,26,-1,25,-1,-1,-1,27,0,-1,-1,29,-1,41,-1,35,-1,40,-1,32,-1,-1,-1,-1,5,-1,-1,43,31,-1,-1,6,-1,-1,-1,-1,-1,42,-1,-1,-1,44,-1,38,33,-1,-1,4,-1,-1,-1,-1,-1,39,-1,-1,-1,37,-1,-1,30,-1,-1,-1,34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,-1,-1,-1,36,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {1,-1,-1,-1,3,-1,-1,-1,-1,-1,2,-1,60,-1,0,-1,49,-1,62,-1,55,-1,61,-1,52,-1,-1,-1,46,-1,-1,-1,64,51,-1,-1,-1,47,-1,-1,-1,-1,63,-1,-1,-1,65,-1,58,53,-1,-1,-1,45,-1,-1,-1,-1,59,-1,-1,-1,57,-1,-1,50,-1,-1,-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,-1,-1,-1,56,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {24,-1,-1,-1,26,-1,-1,-1,-1,-1,25,-1,-1,60,27,0,67,-1,79,-1,73,-1,78,-1,70,-1,-1,-1,-1,46,-1,-1,81,69,-1,-1,47,-1,-1,-1,-1,-1,80,-1,-1,-1,82,-1,76,71,-1,-1,45,-1,-1,-1,-1,-1,77,-1,-1,-1,75,-1,-1,68,-1,-1,-1,72,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {5,-1,-1,-1,11,-1,-1,-1,14,-1,19,-1,8,-1,20,-1,0,-1,-1,-1,2,-1,-1,-1,-1,-1,3,-1,-1,-1,1,-1,-1,15,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,17,12,-1,-1,-1,-1,16,-1,-1,-1,18,-1,-1,6,-1,-1,22,10,-1,-1,-1,-1,23,-1,-1,-1,21,-1},
    {-1,5,-1,-1,32,-1,-1,-1,35,-1,40,-1,29,-1,41,-1,27,0,-1,-1,25,-1,-1,-1,-1,-1,26,-1,-1,-1,24,-1,-1,36,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,34,-1,-1,-1,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,38,33,-1,-1,-1,-1,37,-1,-1,-1,39,-1,6,-1,-1,-1,43,31,-1,-1,-1,-1,44,-1,-1,-1,42,-1},
    {46,-1,-1,-1,52,-1,-1,-1,55,-1,61,-1,49,-1,62,-1,60,-1,0,-1,-1,-1,2,-1,3,-1,-1,-1,1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,45,-1,-1,58,53,-1,-1,-1,-1,57,-1,-1,-1,59,-1,-1,47,-1,-1,64,51,-1,-1,-1,-1,65,-1,-1,-1,63,-1},
    {-1,46,-1,-1,70,-1,-1,-1,73,-1,78,-1,67,-1,79,-1,-1,60,27,0,-1,-1,25,-1,26,-1,-1,-1,24,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,-1,-1,-1,68,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,45,-1,-1,-1,76,71,-1,-1,-1,-1,75,-1,-1,-1,77,-1,47,-1,-1,-1,81,69,-1,-1,-1,-1,82,-1,-1,-1,80,-1},
    {11,-1,-1,-1,5,-1,-1,-1,8,-1,20,-1,14,-1,19,-1,2,-1,-1,-1,0,-1,-1,-1,-1,-1,1,-1,-1,-1,3,-1,-1,9,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,22,10,-1,-1,-1,6,-1,-1,-1,-1,23,-1,-1,-1,21,-1,17,12,-1,-1,-1,4,-1,-1,-1,-1,16,-1,-1,-1,18,-1},
    {32,-1,-1,-1,-1,5,-1,-1,29,-1,41,-1,35,-1,40,-1,25,-1,-1,-1,27,0,-1,-1,-1,-1,24,-1,-1,-1,26,-1,-1,30,-1,-1,-1,34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,-1,-1,-1,36,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,43,31,-1,-1,6,-1,-1,-1,-1,-1,44,-1,-1,-1,42,-1,38,33,-1,-1,4,-1,-1,-1,-1,-1,37,-1,-1,-1,39,-1},
    {52,-1,-1,-1,46,-1,-1,-1,49,-1,62,-1,55,-1,61,-1,-1,-1,2,-1,60,-1,0,-1,1,-1,-1,-1,3,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,-1,-1,-1,56,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,64,51,-1,-1,-1,47,-1,-1,-1,-1,65,-1,-1,-1,63,-1,58,53,-1,-1,-1,45,-1,-1,-1,-1,57,-1,-1,-1,59,-1},
    {70,-1,-1,-1,-1,46,-1,-1,67,-1,79,-1,73,-1,78,-1,-1,-1,25,-1,-1,60,27,0,24,-1,-1,-1,26,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,81,69,-1,-1,47,-1,-1,-1,-1,-1,82,-1,-1,-1,80,-1,76,71,-1,-1,45,-1,-1,-1,-1,-1,75,-1,-1,-1,77,-1},
    {8,-1,20,-1,14,-1,19,-1,5,-1,-1,-1,11,-1,-1,-1,-1,-1,1,-1,-1,-1,3,-1,0,-1,-1,-1,2,-1,-1,-1,-1,6,-1,-1,22,10,-1,-1,-1,-1,23,-1,-1,-1,21,-1,-1,4,-1,-1,17,12,-1,-1,-1,-1,16,-1,-1,-1,18,-1,-1,7,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {29,-1,41,-1,35,-1,40,-1,-1,5,-1,-1,32,-1,-1,-1,-1,-1,24,-1,-1,-1,26,-1,27,0,-1,-1,25,-1,-1,-1,6,-1,-1,-1,43,31,-1,-1,-1,-1,44,-1,-1,-1,42,-1,4,-1,-1,-1,38,33,-1,-1,-1,-1,37,-1,-1,-1,39,-1,-1,28,-1,-1,-1,36,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1,-1,-1,34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {49,-1,62,-1,55,-1,61,-1,46,-1,-1,-1,52,-1,-1,-1,1,-1,-1,-1,3,-1,-1,-1,60,-1,0,-1,-1,-1,2,-1,-1,47,-1,-1,64,51,-1,-1,-1,-1,65,-1,-1,-1,63,-1,-1,45,-1,-1,58,53,-1,-1,-1,-1,57,-1,-1,-1,59,-1,-1,48,-1,-1,-1,56,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {67,-1,79,-1,73,-1,78,-1,-1,46,-1,-1,70,-1,-1,-1,24,-1,-1,-1,26,-1,-1,-1,-1,60,27,0,-1,-1,25,-1,47,-1,-1,-1,81,69,-1,-1,-1,-1,82,-1,-1,-1,80,-1,45,-1,-1,-1,76,71,-1,-1,-1,-1,75,-1,-1,-1,77,-1,-1,66,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {14,-1,19,-1,8,-1,20,-1,11,-1,-1,-1,5,-1,-1,-1,-1,-1,3,-1,-1,-1,1,-1,2,-1,-1,-1,0,-1,-1,-1,17,12,-1,-1,-1,4,-1,-1,-1,-1,16,-1,-1,-1,18,-1,22,10,-1,-1,-1,6,-1,-1,-1,-1,23,-1,-1,-1,21,-1,-1,13,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {35,-1,40,-1,29,-1,41,-1,32,-1,-1,-1,-1,5,-1,-1,-1,-1,26,-1,-1,-1,24,-1,25,-1,-1,-1,27,0,-1,-1,38,33,-1,-1,4,-1,-1,-1,-1,-1,37,-1,-1,-1,39,-1,43,31,-1,-1,6,-1,-1,-1,-1,-1,44,-1,-1,-1,42,-1,-1,34,-1,-1,-1,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {55,-1,61,-1,49,-1,62,-1,52,-1,-1,-1,46,-1,-1,-1,3,-1,-1,-1,1,-1,-1,-1,-1,-1,2,-1,60,-1,0,-1,58,53,-1,-1,-1,45,-1,-1,-1,-1,57,-1,-1,-1,59,-1,64,51,-1,-1,-1,47,-1,-1,-1,-1,65,-1,-1,-1,63,-1,-1,54,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {73,-1,78,-1,67,-1,79,-1,70,-1,-1,-1,-1,46,-1,-1,26,-1,-1,-1,24,-1,-1,-1,-1,-1,25,-1,-1,60,27,0,76,71,-1,-1,45,-1,-1,-1,-1,-1,75,-1,-1,-1,77,-1,81,69,-1,-1,47,-1,-1,-1,-1,-1,82,-1,-1,-1,80,-1,-1,72,-1,-1,-1,68,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
    {-1,-1,23,-1,-1,-1,21,-1,-1,6,-1,-1,22,10,-1,-1,-1,-1,16,-1,-1,-1,18,-1,-1,4,-1,-1,17,12,-1,-1,0,-1,-1,-1,2,-1,-1,-1,-1,-1,3,-1,-1,-1,1,-1,5,-1,-1,-1,11,-1,-1,-1,14,-1,19,-1,8,-1,20,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,9,-1,-1},
    {-1,-1,44,-1,-1,-1,42,-1,6,-1,-1,-1,43,31,-1,-1,-1,-1,37,-1,-1,-1,39,-1,4,-1,-1,-1,38,33,-1,-1,27,0,-1,-1,25,-1,-1,-1,-1,-1,26,-1,-1,-1,24,-1,-1,5,-1,-1,32,-1,-1,-1,35,-1,40,-1,29,-1,41,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,34,-1,-1,-1,30,-1,-1},
    {-1,-1,65,-1,-1,-1,63,-1,-1,47,-1,-1,64,51,-1,-1,-1,-1,57,-1,-1,-1,59,-1,-1,45,-1,-1,58,53,-1,-1,60,-1,0,-1,-1,-1,2,-1,3,-1,-1,-1,1,-1,-1,-1,46,-1,-1,-1,52,-1,-1,-1,55,-1,61,-1,49,-1,62,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,-1,-1,-1,50,-1,-1},
    {-1,-1,82,-1,-1,-1,80,-1,47,-1,-1,-1,81,69,-1,-1,-1,-1,75,-1,-1,-1,77,-1,45,-1,-1,-1,76,71,-1,-1,-1,60,27,0,-1,-1,25,-1,26,-1,-1,-1,24,-1,-1,-1,-1,46,-1,-1,70,-1,-1,-1,73,-1,78,-1,67,-1,79,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,-1,-1,-1,68,-1,-1},
    {-1,-1,16,-1,-1,-1,18,-1,17,12,-1,-1,-1,4,-1,-1,-1,-1,23,-1,-1,-1,21,-1,22,10,-1,-1,-1,6,-1,-1,2,-1,-1,-1,0,-1,-1,-1,-1,-1,1,-1,-1,-1,3,-1,11,-1,-1,-1,5,-1,-1,-1,8,-1,20,-1,14,-1,19,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,15,-1,-1},
    {-1,-1,37,-1,-1,-1,39,-1,38,33,-1,-1,4,-1,-1,-1,-1,-1,44,-1,-1,-1,42,-1,43,31,-1,-1,6,-1,-1,-1,25,-1,-1,-1,27,0,-1,-1,-1,-1,24,-1,-1,-1,26,-1,32,-1,-1,-1,-1,5,-1,-1,29,-1,41,-1,35,-1,40,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1,-1,-1,34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,-1,-1,-1,36,-1,-1},
    {-1,-1,57,-1,-1,-1,59,-1,58,53,-1,-1,-1,45,-1,-1,-1,-1,65,-1,-1,-1,63,-1,64,51,-1,-1,-1,47,-1,-1,-1,-1,2,-1,60,-1,0,-1,1,-1,-1,-1,3,-1,-1,-1,52,-1,-1,-1,46,-1,-1,-1,49,-1,62,-1,55,-1,61,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,-1,-1,-1,56,-1,-1},
    {-1,-1,75,-1,-1,-1,77,-1,76,71,-1,-1,45,-1,-1,-1,-1,-1,82,-1,-1,-1,80,-1,81,69,-1,-1,47,-1,-1,-1,-1,-1,25,-1,-1,60,27,0,24,-1,-1,-1,26,-1,-1,-1,70,-1,-1,-1,-1,46,-1,-1,67,-1,79,-1,73,-1,78,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,-1,-1,-1,74,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,15,-1,-1,-1,-1,1,-1,-1,-1,3,-1,0,-1,-1,-1,2,-1,-1,-1,8,-1,20,-1,14,-1,19,-1,5,-1,-1,-1,11,-1,-1,-1,-1,-1,23,-1,-1,-1,21,-1,-1,6,-1,-1,22,10,-1,-1,-1,-1,16,-1,-1,-1,18,-1,-1,4,-1,-1,17,12,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1,-1,-1,34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,-1,-1,-1,36,-1,-1,-1,-1,24,-1,-1,-1,26,-1,27,0,-1,-1,25,-1,-1,-1,29,-1,41,-1,35,-1,40,-1,-1,5,-1,-1,32,-1,-1,-1,-1,-1,44,-1,-1,-1,42,-1,6,-1,-1,-1,43,31,-1,-1,-1,-1,37,-1,-1,-1,39,-1,4,-1,-1,-1,38,33,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,-1,-1,-1,56,-1,-1,1,-1,-1,-1,3,-1,-1,-1,60,-1,0,-1,-1,-1,2,-1,49,-1,62,-1,55,-1,61,-1,46,-1,-1,-1,52,-1,-1,-1,-1,-1,65,-1,-1,-1,63,-1,-1,47,-1,-1,64,51,-1,-1,-1,-1,57,-1,-1,-1,59,-1,-1,45,-1,-1,58,53,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,-1,-1,-1,74,-1,-1,24,-1,-1,-1,26,-1,-1,-1,-1,60,27,0,-1,-1,25,-1,67,-1,79,-1,73,-1,78,-1,-1,46,-1,-1,70,-1,-1,-1,-1,-1,82,-1,-1,-1,80,-1,47,-1,-1,-1,81,69,-1,-1,-1,-1,75,-1,-1,-1,77,-1,45,-1,-1,-1,76,71,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,9,-1,-1,-1,-1,3,-1,-1,-1,1,-1,2,-1,-1,-1,0,-1,-1,-1,14,-1,19,-1,8,-1,20,-1,11,-1,-1,-1,5,-1,-1,-1,-1,-1,16,-1,-1,-1,18,-1,17,12,-1,-1,-1,4,-1,-1,-1,-1,23,-1,-1,-1,21,-1,22,10,-1,-1,-1,6,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,34,-1,-1,-1,30,-1,-1,-1,-1,26,-1,-1,-1,24,-1,25,-1,-1,-1,27,0,-1,-1,35,-1,40,-1,29,-1,41,-1,32,-1,-1,-1,-1,5,-1,-1,-1,-1,37,-1,-1,-1,39,-1,38,33,-1,-1,4,-1,-1,-1,-1,-1,44,-1,-1,-1,42,-1,43,31,-1,-1,6,-1,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,-1,-1,-1,50,-1,-1,3,-1,-1,-1,1,-1,-1,-1,-1,-1,2,-1,60,-1,0,-1,55,-1,61,-1,49,-1,62,-1,52,-1,-1,-1,46,-1,-1,-1,-1,-1,57,-1,-1,-1,59,-1,58,53,-1,-1,-1,45,-1,-1,-1,-1,65,-1,-1,-1,63,-1,64,51,-1,-1,-1,47,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,-1,-1,-1,68,-1,-1,26,-1,-1,-1,24,-1,-1,-1,-1,-1,25,-1,-1,60,27,0,73,-1,78,-1,67,-1,79,-1,70,-1,-1,-1,-1,46,-1,-1,-1,-1,75,-1,-1,-1,77,-1,76,71,-1,-1,45,-1,-1,-1,-1,-1,82,-1,-1,-1,80,-1,81,69,-1,-1,47,-1,-1,-1},
    {-1,-1,18,-1,-1,-1,16,-1,-1,4,-1,-1,17,12,-1,-1,-1,-1,21,-1,-1,-1,23,-1,-1,6,-1,-1,22,10,-1,-1,5,-1,-1,-1,11,-1,-1,-1,8,-1,20,-1,14,-1,19,-1,0,-1,-1,-1,2,-1,-1,-1,-1,-1,1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,13,-1,-1},
    {-1,-1,39,-1,-1,-1,37,-1,4,-1,-1,-1,38,33,-1,-1,-1,-1,42,-1,-1,-1,44,-1,6,-1,-1,-1,43,31,-1,-1,-1,5,-1,-1,32,-1,-1,-1,29,-1,41,-1,35,-1,40,-1,27,0,-1,-1,25,-1,-1,-1,-1,-1,24,-1,-1,-1,26,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,-1,-1,-1,36,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1,-1,-1,34,-1,-1},
    {-1,-1,59,-1,-1,-1,57,-1,-1,45,-1,-1,58,53,-1,-1,-1,-1,63,-1,-1,-1,65,-1,-1,47,-1,-1,64,51,-1,-1,46,-1,-1,-1,52,-1,-1,-1,49,-1,62,-1,55,-1,61,-1,60,-1,0,-1,-1,-1,2,-1,1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,-1,-1,-1,56,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1},
    {-1,-1,77,-1,-1,-1,75,-1,45,-1,-1,-1,76,71,-1,-1,-1,-1,80,-1,-1,-1,82,-1,47,-1,-1,-1,81,69,-1,-1,-1,46,-1,-1,70,-1,-1,-1,67,-1,79,-1,73,-1,78,-1,-1,60,27,0,-1,-1,25,-1,24,-1,-1,-1,26,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1},
    {-1,-1,21,-1,-1,-1,23,-1,22,10,-1,-1,-1,6,-1,-1,-1,-1,18,-1,-1,-1,16,-1,17,12,-1,-1,-1,4,-1,-1,11,-1,-1,-1,5,-1,-1,-1,14,-1,19,-1,8,-1,20,-1,2,-1,-1,-1,0,-1,-1,-1,-1,-1,3,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,7,-1,-1},
    {-1,-1,42,-1,-1,-1,44,-1,43,31,-1,-1,6,-1,-1,-1,-1,-1,39,-1,-1,-1,37,-1,38,33,-1,-1,4,-1,-1,-1,32,-1,-1,-1,-1,5,-1,-1,35,-1,40,-1,29,-1,41,-1,25,-1,-1,-1,27,0,-1,-1,-1,-1,26,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,34,-1,-1,-1,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,28,-1,-1},
    {-1,-1,63,-1,-1,-1,65,-1,64,51,-1,-1,-1,47,-1,-1,-1,-1,59,-1,-1,-1,57,-1,58,53,-1,-1,-1,45,-1,-1,52,-1,-1,-1,46,-1,-1,-1,55,-1,61,-1,49,-1,62,-1,-1,-1,2,-1,60,-1,0,-1,3,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1},
    {-1,-1,80,-1,-1,-1,82,-1,81,69,-1,-1,47,-1,-1,-1,-1,-1,77,-1,-1,-1,75,-1,76,71,-1,-1,45,-1,-1,-1,70,-1,-1,-1,-1,46,-1,-1,73,-1,78,-1,67,-1,79,-1,-1,-1,25,-1,-1,60,27,0,26,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,-1,-1,-1,68,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,7,-1,-1,14,-1,19,-1,8,-1,20,-1,5,-1,-1,-1,11,-1,-1,-1,-1,-1,3,-1,-1,-1,1,-1,0,-1,-1,-1,2,-1,-1,-1,-1,-1,18,-1,-1,-1,16,-1,-1,4,-1,-1,17,12,-1,-1,-1,-1,21,-1,-1,-1,23,-1,-1,6,-1,-1,22,10,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,34,-1,-1,-1,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,28,-1,-1,35,-1,40,-1,29,-1,41,-1,-1,5,-1,-1,32,-1,-1,-1,-1,-1,26,-1,-1,-1,24,-1,27,0,-1,-1,25,-1,-1,-1,-1,-1,39,-1,-1,-1,37,-1,4,-1,-1,-1,38,33,-1,-1,-1,-1,42,-1,-1,-1,44,-1,6,-1,-1,-1,43,31,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,54,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1,55,-1,61,-1,49,-1,62,-1,46,-1,-1,-1,52,-1,-1,-1,3,-1,-1,-1,1,-1,-1,-1,60,-1,0,-1,-1,-1,2,-1,-1,-1,59,-1,-1,-1,57,-1,-1,45,-1,-1,58,53,-1,-1,-1,-1,63,-1,-1,-1,65,-1,-1,47,-1,-1,64,51,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,72,-1,-1,-1,68,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1,73,-1,78,-1,67,-1,79,-1,-1,46,-1,-1,70,-1,-1,-1,26,-1,-1,-1,24,-1,-1,-1,-1,60,27,0,-1,-1,25,-1,-1,-1,77,-1,-1,-1,75,-1,45,-1,-1,-1,76,71,-1,-1,-1,-1,80,-1,-1,-1,82,-1,47,-1,-1,-1,81,69,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,13,-1,-1,8,-1,20,-1,14,-1,19,-1,11,-1,-1,-1,5,-1,-1,-1,-1,-1,1,-1,-1,-1,3,-1,2,-1,-1,-1,0,-1,-1,-1,-1,-1,21,-1,-1,-1,23,-1,22,10,-1,-1,-1,6,-1,-1,-1,-1,18,-1,-1,-1,16,-1,17,12,-1,-1,-1,4,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,28,-1,-1,-1,36,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1,-1,-1,34,-1,-1,29,-1,41,-1,35,-1,40,-1,32,-1,-1,-1,-1,5,-1,-1,-1,-1,24,-1,-1,-1,26,-1,25,-1,-1,-1,27,0,-1,-1,-1,-1,42,-1,-1,-1,44,-1,43,31,-1,-1,6,-1,-1,-1,-1,-1,39,-1,-1,-1,37,-1,38,33,-1,-1,4,-1,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,48,-1,-1,-1,56,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1,49,-1,62,-1,55,-1,61,-1,52,-1,-1,-1,46,-1,-1,-1,1,-1,-1,-1,3,-1,-1,-1,-1,-1,2,-1,60,-1,0,-1,-1,-1,63,-1,-1,-1,65,-1,64,51,-1,-1,-1,47,-1,-1,-1,-1,59,-1,-1,-1,57,-1,58,53,-1,-1,-1,45,-1,-1},
    {-1,-1,-1,-1,-1,-1,-1,-1,-1,66,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1,67,-1,79,-1,73,-1,78,-1,70,-1,-1,-1,-1,46,-1,-1,24,-1,-1,-1,26,-1,-1,-1,-1,-1,25,-1,-1,60,27,0,-1,-1,80,-1,-1,-1,82,-1,81,69,-1,-1,47,-1,-1,-1,-1,-1,77,-1,-1,-1,75,-1,76,71,-1,-1,45,-1,-1,-1},
    {-1,4,-1,-1,17,12,-1,-1,-1,-1,16,-1,-1,-1,18,-1,-1,6,-1,-1,22,10,-1,-1,-1,-1,23,-1,-1,-1,21,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,13,-1,-1,0,-1,-1,-1,2,-1,-1,-1,-1,-1,1,-1,-1,-1,3,-1,5,-1,-1,-1,11,-1,-1,-1,8,-1,20,-1,14,-1,19,-1},
    {4,-1,-1,-1,38,33,-1,-1,-1,-1,37,-1,-1,-1,39,-1,6,-1,-1,-1,43,31,-1,-1,-1,-1,44,-1,-1,-1,42,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,-1,-1,-1,36,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1,-1,-1,34,-1,-1,27,0,-1,-1,25,-1,-1,-1,-1,-1,24,-1,-1,-1,26,-1,-1,5,-1,-1,32,-1,-1,-1,29,-1,41,-1,35,-1,40,-1},
    {-1,45,-1,-1,58,53,-1,-1,-1,-1,57,-1,-1,-1,59,-1,-1,47,-1,-1,64,51,-1,-1,-1,-1,65,-1,-1,-1,63,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,-1,-1,-1,56,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1,60,-1,0,-1,-1,-1,2,-1,1,-1,-1,-1,3,-1,-1,-1,46,-1,-1,-1,52,-1,-1,-1,49,-1,62,-1,55,-1,61,-1},
    {45,-1,-1,-1,76,71,-1,-1,-1,-1,75,-1,-1,-1,77,-1,47,-1,-1,-1,81,69,-1,-1,-1,-1,82,-1,-1,-1,80,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1,-1,60,27,0,-1,-1,25,-1,24,-1,-1,-1,26,-1,-1,-1,-1,46,-1,-1,70,-1,-1,-1,67,-1,79,-1,73,-1,78,-1},
    {22,10,-1,-1,-1,6,-1,-1,-1,-1,23,-1,-1,-1,21,-1,17,12,-1,-1,-1,4,-1,-1,-1,-1,16,-1,-1,-1,18,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,7,-1,-1,2,-1,-1,-1,0,-1,-1,-1,-1,-1,3,-1,-1,-1,1,-1,11,-1,-1,-1,5,-1,-1,-1,14,-1,19,-1,8,-1,20,-1},
    {43,31,-1,-1,6,-1,-1,-1,-1,-1,44,-1,-1,-1,42,-1,38,33,-1,-1,4,-1,-1,-1,-1,-1,37,-1,-1,-1,39,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,34,-1,-1,-1,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,28,-1,-1,25,-1,-1,-1,27,0,-1,-1,-1,-1,26,-1,-1,-1,24,-1,32,-1,-1,-1,-1,5,-1,-1,35,-1,40,-1,29,-1,41,-1},
    {64,51,-1,-1,-1,47,-1,-1,-1,-1,65,-1,-1,-1,63,-1,58,53,-1,-1,-1,45,-1,-1,-1,-1,57,-1,-1,-1,59,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1,-1,-1,2,-1,60,-1,0,-1,3,-1,-1,-1,1,-1,-1,-1,52,-1,-1,-1,46,-1,-1,-1,55,-1,61,-1,49,-1,62,-1},
    {81,69,-1,-1,47,-1,-1,-1,-1,-1,82,-1,-1,-1,80,-1,76,71,-1,-1,45,-1,-1,-1,-1,-1,75,-1,-1,-1,77,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,-1,-1,-1,68,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1,-1,-1,25,-1,-1,60,27,0,26,-1,-1,-1,24,-1,-1,-1,70,-1,-1,-1,-1,46,-1,-1,73,-1,78,-1,67,-1,79,-1},
    {-1,13,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,-1,-1,-1,18,-1,-1,4,-1,-1,17,12,-1,-1,-1,-1,23,-1,-1,-1,21,-1,-1,6,-1,-1,22,10,-1,-1,-1,-1,3,-1,-1,-1,1,-1,0,-1,-1,-1,2,-1,-1,-1,14,-1,19,-1,8,-1,20,-1,5,-1,-1,-1,11,-1,-1,-1},
    {-1,34,-1,-1,-1,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,37,-1,-1,-1,39,-1,4,-1,-1,-1,38,33,-1,-1,-1,-1,44,-1,-1,-1,42,-1,6,-1,-1,-1,43,31,-1,-1,-1,-1,26,-1,-1,-1,24,-1,27,0,-1,-1,25,-1,-1,-1,35,-1,40,-1,29,-1,41,-1,-1,5,-1,-1,32,-1,-1,-1},
    {-1,54,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,57,-1,-1,-1,59,-1,-1,45,-1,-1,58,53,-1,-1,-1,-1,65,-1,-1,-1,63,-1,-1,47,-1,-1,64,51,-1,-1,3,-1,-1,-1,1,-1,-1,-1,60,-1,0,-1,-1,-1,2,-1,55,-1,61,-1,49,-1,62,-1,46,-1,-1,-1,52,-1,-1,-1},
    {-1,72,-1,-1,-1,68,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,75,-1,-1,-1,77,-1,45,-1,-1,-1,76,71,-1,-1,-1,-1,82,-1,-1,-1,80,-1,47,-1,-1,-1,81,69,-1,-1,26,-1,-1,-1,24,-1,-1,-1,-1,60,27,0,-1,-1,25,-1,73,-1,78,-1,67,-1,79,-1,-1,46,-1,-1,70,-1,-1,-1},
    {-1,7,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,23,-1,-1,-1,21,-1,22,10,-1,-1,-1,6,-1,-1,-1,-1,16,-1,-1,-1,18,-1,17,12,-1,-1,-1,4,-1,-1,-1,-1,1,-1,-1,-1,3,-1,2,-1,-1,-1,0,-1,-1,-1,8,-1,20,-1,14,-1,19,-1,11,-1,-1,-1,5,-1,-1,-1},
    {-1,28,-1,-1,-1,36,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1,-1,-1,34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,44,-1,-1,-1,42,-1,43,31,-1,-1,6,-1,-1,-1,-1,-1,37,-1,-1,-1,39,-1,38,33,-1,-1,4,-1,-1,-1,-1,-1,24,-1,-1,-1,26,-1,25,-1,-1,-1,27,0,-1,-1,29,-1,41,-1,35,-1,40,-1,32,-1,-1,-1,-1,5,-1,-1},
    {-1,48,-1,-1,-1,56,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65,-1,-1,-1,63,-1,64,51,-1,-1,-1,47,-1,-1,-1,-1,57,-1,-1,-1,59,-1,58,53,-1,-1,-1,45,-1,-1,1,-1,-1,-1,3,-1,-1,-1,-1,-1,2,-1,60,-1,0,-1,49,-1,62,-1,55,-1,61,-1,52,-1,-1,-1,46,-1,-1,-1},
    {-1,66,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,82,-1,-1,-1,80,-1,81,69,-1,-1,47,-1,-1,-1,-1,-1,75,-1,-1,-1,77,-1,76,71,-1,-1,45,-1,-1,-1,24,-1,-1,-1,26,-1,-1,-1,-1,-1,25,-1,-1,60,27,0,67,-1,79,-1,73,-1,78,-1,70,-1,-1,-1,-1,46,-1,-1},
    {-1,6,-1,-1,22,10,-1,-1,-1,-1,21,-1,-1,-1,23,-1,-1,4,-1,-1,17,12,-1,-1,-1,-1,18,-1,-1,-1,16,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,9,-1,-1,5,-1,-1,-1,11,-1,-1,-1,14,-1,19,-1,8,-1,20,-1,0,-1,-1,-1,2,-1,-1,-1,-1,-1,3,-1,-1,-1,1,-1},
    {6,-1,-1,-1,43,31,-1,-1,-1,-1,42,-1,-1,-1,44,-1,4,-1,-1,-1,38,33,-1,-1,-1,-1,39,-1,-1,-1,37,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,34,-1,-1,-1,30,-1,-1,-1,5,-1,-1,32,-1,-1,-1,35,-1,40,-1,29,-1,41,-1,27,0,-1,-1,25,-1,-1,-1,-1,-1,26,-1,-1,-1,24,-1},
    {-1,47,-1,-1,64,51,-1,-1,-1,-1,63,-1,-1,-1,65,-1,-1,45,-1,-1,58,53,-1,-1,-1,-1,59,-1,-1,-1,57,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,56,-1,-1,-1,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,-1,-1,-1,50,-1,-1,46,-1,-1,-1,52,-1,-1,-1,55,-1,61,-1,49,-1,62,-1,60,-1,0,-1,-1,-1,2,-1,3,-1,-1,-1,1,-1,-1,-1},
    {47,-1,-1,-1,81,69,-1,-1,-1,-1,80,-1,-1,-1,82,-1,45,-1,-1,-1,76,71,-1,-1,-1,-1,77,-1,-1,-1,75,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,74,-1,-1,-1,66,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,-1,-1,-1,68,-1,-1,-1,46,-1,-1,70,-1,-1,-1,73,-1,78,-1,67,-1,79,-1,-1,60,27,0,-1,-1,25,-1,26,-1,-1,-1,24,-1,-1,-1},
    {17,12,-1,-1,-1,4,-1,-1,-1,-1,18,-1,-1,-1,16,-1,22,10,-1,-1,-1,6,-1,-1,-1,-1,21,-1,-1,-1,23,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,15,-1,-1,11,-1,-1,-1,5,-1,-1,-1,8,-1,20,-1,14,-1,19,-1,2,-1,-1,-1,0,-1,-1,-1,-1,-1,1,-1,-1,-1,3,-1},
    {38,33,-1,-1,4,-1,-1,-1,-1,-1,39,-1,-1,-1,37,-1,43,31,-1,-1,6,-1,-1,-1,-1,-1,42,-1,-1,-1,44,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1,-1,-1,34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,-1,-1,-1,36,-1,-1,32,-1,-1,-1,-1,5,-1,-1,29,-1,41,-1,35,-1,40,-1,25,-1,-1,-1,27,0,-1,-1,-1,-1,24,-1,-1,-1,26,-1},
    {58,53,-1,-1,-1,45,-1,-1,-1,-1,59,-1,-1,-1,57,-1,64,51,-1,-1,-1,47,-1,-1,-1,-1,63,-1,-1,-1,65,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,50,-1,-1,-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,-1,-1,-1,56,-1,-1,52,-1,-1,-1,46,-1,-1,-1,49,-1,62,-1,55,-1,61,-1,-1,-1,2,-1,60,-1,0,-1,1,-1,-1,-1,3,-1,-1,-1},
    {76,71,-1,-1,45,-1,-1,-1,-1,-1,77,-1,-1,-1,75,-1,81,69,-1,-1,47,-1,-1,-1,-1,-1,80,-1,-1,-1,82,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,68,-1,-1,-1,72,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,-1,-1,-1,74,-1,-1,70,-1,-1,-1,-1,46,-1,-1,67,-1,79,-1,73,-1,78,-1,-1,-1,25,-1,-1,60,27,0,24,-1,-1,-1,26,-1,-1,-1},
    {-1,9,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,21,-1,-1,-1,23,-1,-1,6,-1,-1,22,10,-1,-1,-1,-1,18,-1,-1,-1,16,-1,-1,4,-1,-1,17,12,-1,-1,8,-1,20,-1,14,-1,19,-1,5,-1,-1,-1,11,-1,-1,-1,-1,-1,1,-1,-1,-1,3,-1,0,-1,-1,-1,2,-1,-1,-1},
    {-1,30,-1,-1,-1,34,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,28,-1,-1,-1,36,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,42,-1,-1,-1,44,-1,6,-1,-1,-1,43,31,-1,-1,-1,-1,39,-1,-1,-1,37,-1,4,-1,-1,-1,38,33,-1,-1,29,-1,41,-1,35,-1,40,-1,-1,5,-1,-1,32,-1,-1,-1,-1,-1,24,-1,-1,-1,26,-1,27,0,-1,-1,25,-1,-1,-1},
    {-1,50,-1,-1,-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,-1,-1,-1,56,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,63,-1,-1,-1,65,-1,-1,47,-1,-1,64,51,-1,-1,-1,-1,59,-1,-1,-1,57,-1,-1,45,-1,-1,58,53,-1,-1,49,-1,62,-1,55,-1,61,-1,46,-1,-1,-1,52,-1,-1,-1,1,-1,-1,-1,3,-1,-1,-1,60,-1,0,-1,-1,-1,2,-1},
    {-1,68,-1,-1,-1,72,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,66,-1,-1,-1,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,80,-1,-1,-1,82,-1,47,-1,-1,-1,81,69,-1,-1,-1,-1,77,-1,-1,-1,75,-1,45,-1,-1,-1,76,71,-1,-1,67,-1,79,-1,73,-1,78,-1,-1,46,-1,-1,70,-1,-1,-1,24,-1,-1,-1,26,-1,-1,-1,-1,60,27,0,-1,-1,25,-1},
    {-1,15,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,18,-1,-1,-1,16,-1,17,12,-1,-1,-1,4,-1,-1,-1,-1,21,-1,-1,-1,23,-1,22,10,-1,-1,-1,6,-1,-1,14,-1,19,-1,8,-1,20,-1,11,-1,-1,-1,5,-1,-1,-1,-1,-1,3,-1,-1,-1,1,-1,2,-1,-1,-1,0,-1,-1,-1},
    {-1,36,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,34,-1,-1,-1,30,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,39,-1,-1,-1,37,-1,38,33,-1,-1,4,-1,-1,-1,-1,-1,42,-1,-1,-1,44,-1,43,31,-1,-1,6,-1,-1,-1,35,-1,40,-1,29,-1,41,-1,32,-1,-1,-1,-1,5,-1,-1,-1,-1,26,-1,-1,-1,24,-1,25,-1,-1,-1,27,0,-1,-1},
    {-1,56,-1,-1,-1,48,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,54,-1,-1,-1,50,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,-1,-1,-1,57,-1,58,53,-1,-1,-1,45,-1,-1,-1,-1,63,-1,-1,-1,65,-1,64,51,-1,-1,-1,47,-1,-1,55,-1,61,-1,49,-1,62,-1,52,-1,-1,-1,46,-1,-1,-1,3,-1,-1,-1,1,-1,-1,-1,-1,-1,2,-1,60,-1,0,-1},
    {-1,74,-1,-1,-1,66,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,72,-1,-1,-1,68,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,77,-1,-1,-1,75,-1,76,71,-1,-1,45,-1,-1,-1,-1,-1,80,-1,-1,-1,82,-1,81,69,-1,-1,47,-1,-1,-1,73,-1,78,-1,67,-1,79,-1,70,-1,-1,-1,-1,46,-1,-1,26,-1,-1,-1,24,-1,-1,-1,-1,-1,25,-1,-1,60,27,0}
};

// 查找状态索引
static int find_state_index(const char* state_str) {
    for (int i = 0; i < 24; i++) {
        if (state_str_list[i][0] == state_str[0] && state_str_list[i][1] == state_str[1]) {
            return i;
        }
    }
    return -1;
}

// 编码状态
static int encode_state(const char* state_str, const bool l_arm, const bool r_arm) {
    int state_idx = find_state_index(state_str);
    if (state_idx == -1) {
        printf("未知的状态字符串: %s\n", state_str);
        return -1;
    }
    return (state_idx << 2) | (l_arm << 1) | r_arm;
}

// 解码状态
static void decode_state(const int8_t state_int, char* state_str, bool* l_arm, bool* r_arm) {
    int8_t state_idx = state_int >> 2;
    if (state_idx >= 24) {
        printf("未知的状态编码: %d\n", state_int);
        state_idx = 0;
    }
    *l_arm = (state_int >> 1) & 1;
    *r_arm = state_int & 1;
    state_str[0] = state_str_list[state_idx][0];
    state_str[1] = state_str_list[state_idx][1];
    state_str[2] = 0;
}

// 计算旋转操作的时间和状态变化
// output_sequence的长度至少为14
// 如果不需要返回字符串，可以设置os = 0
static int calculate_twist_time_and_state(const int8_t state_int, const char* action_str, 
                    int8_t* new_state_int, char* os) {
    char state_str[3];
    bool l_arm, r_arm;
    decode_state(state_int, state_str, &l_arm, &r_arm);
    
    char face = action_str[0];
    char modifier = action_str[1]; // 可能为'\0'、'\''或'2'

    int time_cost = 0;
    ArmSide arm_side;
    // 确定使用哪只手臂
    if (state_str[0] == face) {
        arm_side = LEFT;
    } else if (state_str[1] == face) {
        arm_side = RIGHT;
    } else {
        // ESP_LOGI(TAG, "状态 %d (%s) 无法操作目标面 %c", state_int, state_str, face);
        return -1;
    }
    
    // 检查是否需要空转操作
    if (arm_side == LEFT && r_arm) {
        if(os) strcat(os, "R2 R+N R0 ");
        time_cost += ARM_BACK;
        r_arm = false;
    } else if (arm_side == RIGHT && l_arm) {
        if(os) strcat(os, "L2 L+N L0 ");
        time_cost += ARM_BACK;
        l_arm = false;
    }

    // 根据修饰符确定旋转类型
    if (arm_side == LEFT) {
        if (modifier == '\'') {  // 逆时针90°
            if(os) strcat(os, "L-T ");
            time_cost += ROTATE_90;
            l_arm = !l_arm;
        } else if (modifier == '2') {  // 180°
            if(os) strcat(os, "L*T ");
            time_cost += ROTATE_180;
        } else {  // 顺时针90°
            if(os) strcat(os, "L+T ");
            time_cost += ROTATE_90;
            l_arm = !l_arm;
        }
    } else {  // 右臂操作
        if (modifier == '\'') {  // 逆时针90°
            if(os) strcat(os, "R-T ");
            time_cost += ROTATE_90;
            r_arm = !r_arm;
        } else if (modifier == '2') {  // 180°
            if(os) strcat(os, "R*T ");
            time_cost += ROTATE_180;
        } else {  // 顺时针90°
            if(os) strcat(os, "R+T ");
            time_cost += ROTATE_90;
            r_arm = !r_arm;
        }
    }

    *new_state_int = encode_state(state_str, l_arm, r_arm);
    return time_cost;
}

// 动态规划状态结构
typedef struct {
    int8_t prev_state;
    int8_t mid_state;  // 新增字段：翻面后的状态
    int8_t flip_index;
    int8_t valid;
    int16_t time;
} DPState;

// 优化动作序列（带详细调试信息）
// 优化动作序列（使用状态跟踪代替完整序列存储）
static int cube_tweak_str_time(int8_t initial_state, const char* action_str, 
                        char* output_sequence, int8_t* final_state) {
    // 解析动作字符串
    char actions[MAX_ACTIONS][3];
    int action_count = 0;
    const char* p = action_str;
    
    while (*p && action_count < MAX_ACTIONS) {
        // 跳过空格
        while (*p == ' ') p++;
        if (!*p) break;
        
        // 获取动作面
        char face = *p++;
        actions[action_count][0] = face;
        
        // 获取修饰符（如果存在）
        if (*p == '\'' || *p == '2') {
            actions[action_count][1] = *p++;
            actions[action_count][2] = '\0';
        } else {
            actions[action_count][1] = '\0';
            actions[action_count][2] = '\0';
        }
        
        action_count++;
        //ESP_LOGI(TAG, "解析动作 %d: %s", action_count, actions[action_count-1]);
    }

    // 分配DP表内存（使用修改后的DPState结构）
    int dp_size = (action_count + 1) * sizeof(DPState) * MAX_DP_STATES;
    //ESP_LOGI(TAG, "分配内存 %.1f KB", dp_size/1024.0f);
    DPState (*dp)[MAX_DP_STATES] = malloc(dp_size);
    if (!dp) {
        printf("内存分配失败\n");
        return -1;
    }
    
    // 初始化DP表
    for (int i = 0; i <= action_count; i++) {
        for (int j = 0; j < MAX_DP_STATES; j++) {
            dp[i][j].time = SHRT_MAX;
            dp[i][j].prev_state = -1;
            dp[i][j].mid_state = -1;
            dp[i][j].flip_index = -1;
            dp[i][j].valid = false;
        }
    }
    
    // 初始状态
    dp[0][initial_state].time = 0;
    dp[0][initial_state].prev_state = -1;
    dp[0][initial_state].mid_state = -1;
    dp[0][initial_state].flip_index = -1;
    dp[0][initial_state].valid = true;
    
    // DP处理每个动作
    for (int step = 0; step < action_count; step++) {
        for (int state = 0; state < MAX_DP_STATES; state++) {
            if (!dp[step][state].valid) continue;
            
            //ESP_LOGI(TAG, "  当前状态: %d, 累计时间: %d", state, dp[step][state].time);
            
            // 尝试所有可能的翻面路径 (包括不翻面)
            for (int target_state = 0; target_state < MAX_DP_STATES; target_state++) {
                int8_t seq_index = flip_table[state][target_state];
                if (seq_index == -1) continue;
                
                FlipSequence flip = flip_sequences[seq_index];
                // ESP_LOGI(TAG, "    考虑翻面到 %d (序列 %s)", target_state, flip.sequence);
                // 在目标状态下尝试旋转
                int8_t flip_twist_new_state;
                int flip_twist_time = calculate_twist_time_and_state(
                    target_state, actions[step], &flip_twist_new_state, NULL);
                
                if (flip_twist_time >= 0) {
                    int total_time = dp[step][state].time + flip.time + flip_twist_time;
                    
                    if (total_time < dp[step+1][flip_twist_new_state].time) {
                        dp[step+1][flip_twist_new_state].time = total_time;
                        dp[step+1][flip_twist_new_state].prev_state = state;
                        dp[step+1][flip_twist_new_state].mid_state = target_state;  // 存储中间状态
                        dp[step+1][flip_twist_new_state].flip_index = seq_index;
                        dp[step+1][flip_twist_new_state].valid = true;
                        //ESP_LOGI(TAG, "    翻面到%-2d状态 (序列 %-30s) 旋转到%-2d状态, 总时间 %-4d",
                        //         target_state, flip.sequence, flip_twist_new_state, total_time);
                    }
                }
            }
        }
    }
    
    // 查找最优解
    int min_time = INT_MAX;
    int8_t best_state = -1;
    
    for (int state = 0; state < MAX_DP_STATES; state++) {
        if (dp[action_count][state].valid && dp[action_count][state].time < min_time) {
            min_time = dp[action_count][state].time;
            best_state = state;
        }
    }
    
    if (best_state == -1) {
        printf("未找到有效路径\n");
        free(dp);
        return -1;
    }
    
    // 回溯构建序列
    // calculate_twist_time_and_state最长14
    // flip_sequences[flip_index].sequence最长28
    // 14+28+1=43，此处取64
    int8_t current_state = best_state;
    char step_seqs[MAX_ACTIONS][64] = {0};
    int step_count = 0;
    
    for (int step = action_count; step >= 1; step--) {
        int8_t mid_state = dp[step][current_state].mid_state;
        int8_t prev_state = dp[step][current_state].prev_state;
        int8_t flip_index = dp[step][current_state].flip_index;
        char *p_str = step_seqs[step_count];
        p_str[0] = '\0';
        // 写入翻面操作步骤
        if (flip_index != -1) {
            strcpy(p_str, flip_sequences[flip_index].sequence);
        }
        // 在末尾追加旋转操作步骤
        int8_t temp_state;
        calculate_twist_time_and_state(mid_state, actions[step-1], &temp_state, p_str);
        
        step_count++;
        current_state = prev_state;
    }
    
    // 按正确顺序拼接序列
    for (int i = step_count - 1; i >= 0; i--) {
        strcat(output_sequence, step_seqs[i]);
    }
    
    *final_state = best_state;
    //ESP_LOGI(TAG, "最优状态: %d, 总时间: %d", best_state, min_time);
    free(dp);
    return min_time;
}
// 调整最终位置
// output_sequence的长度至少为10
static int adjust_final_position(int8_t final_state, char* output_sequence) {
    char state_str[3];
    bool l_arm, r_arm;
    int adjust_time = 0;
    decode_state(final_state, state_str, &l_arm, &r_arm);
    
    if (l_arm) {
        strcat(output_sequence, "L2 L+N L0 ");
        adjust_time = ARM_BACK;
    }
    if (r_arm) {
        strcat(output_sequence, "R2 R+N R0 ");
        adjust_time = ARM_BACK;
    }
    return adjust_time;
}

// 解决方案入口
int solution_to_motion(const char* initial_state, const char* action_str, char* output_sequence) 
{
    int time = 0, adj_time = 0;
    int8_t final_state = 0;
    int8_t initial_state_int = encode_state(initial_state, false, false);
    output_sequence[0] = '\0';// 解决连续调用solution_to_motion会出现内存越界的BUG
    time = cube_tweak_str_time(initial_state_int, action_str, output_sequence, &final_state);
    if(time < 0){
        printf("调用cube_tweak_str_time出错\n");
        return -1;
    }
    // 调整位置
    adj_time = adjust_final_position(final_state, output_sequence);
    return time + adj_time;
}
